package com.cn.bulu.utils.jiguang;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.cn.bulu.utils.Constant;

import cn.jiguang.common.ClientConfig;
import cn.jiguang.common.TimeUnit;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
import cn.jpush.api.push.model.notification.WinphoneNotification;
import cn.jpush.api.report.ReceivedsResult;
import cn.jpush.api.report.ReceivedsResult.Received;
import cn.jpush.api.report.UsersResult;

/**
 * 
 * @author zhaochaoj 发送推送工具
 *
 */
public class JpushSendUtil {
	protected static final Logger log = LoggerFactory.getLogger(JpushSendUtil.class);

	static String APP_KEY = Constant.APP_KEY;
	static String MASTER_SECRET = Constant.MASTER_SECRET;
	static String APP_KEY_MERCHANTS = Constant.APP_KEY_MERCHANTS;
	static String MASTER_SECRET_MERCHANTS = Constant.MASTER_SECRET_MERCHANTS;

	private static JPushClient jpushClient = null;

	/**
	 * 推送通知接口
	 * 
	 * @param alias
	 *            别名
	 * @param tags
	 *            tag数组
	 * @param title
	 *            推送标题
	 * @param btype
	 *            推送类型
	 * @param content
	 *            推送内容
	 */
	public static void sendPushNotice(String alias, String[] tags, String title, String btype, String content) {
		jpushClient = new JPushClient(MASTER_SECRET, APP_KEY, null, ClientConfig.getInstance());
		PushPayload payload = null;
		// 生成推送的内容，这里我们先测试全部推送
		// 通知提示信息
		if (content != null) {
			Map<String, String> map = new HashMap<String, String>();
			map.put("btype", btype);
			// 根据别名推送
			if (alias != null && tags == null) {
				payload = buldPushObject_all_all_alias(alias, title, content, map);
			} else if (alias == null && tags != null) { // 根据tag[]推送
				payload = buldPushObject_all_all_tag(tags, title, content, map);
			} else if (alias != null && tags != null) { // 别名和tags[] 推送通知
				payload = buldPushObject_all_all_aliasAndTag(alias, tags, title, content, map);
			} else if (alias == null && tags == null) {
				payload = buldPushObject_all_all(title, content, map);
			}
		} else {
			log.info("No notification - " + content);
		}
		try {
			System.out.println(payload.toString());
			PushResult result = jpushClient.sendPush(payload);
			System.out.println(result.msg_id + "................................");
			log.info("Got result - " + result);
		} catch (APIConnectionException e) {
			log.error("Connection error. Should retry later. ", e);
		} catch (APIRequestException e) {
			log.error("Error response from JPush server. Should review and fix it. ", e);
			log.info("HTTP Status: " + e.getStatus());
			log.info("Error Code: " + e.getErrorCode());
			log.info("Error Message: " + e.getErrorMessage());
			log.info("Msg ID: " + e.getMsgId());
		}
	}

	/**
	 * 推送自定义消息接口.根据别名修改标签（tag）
	 * 
	 * @param alias
	 *            别名
	 * @param content
	 *            推送内容
	 * @param msgType
	 *            安卓发送的请求类型 0订单 1文本 2异地登录
	 */
	public static void sendPushMessage(String alias, String content, Map<String, String> msgType) {

		jpushClient = new JPushClient(MASTER_SECRET, APP_KEY, null, ClientConfig.getInstance());
		PushPayload payload = null;
		// For push, all you need do is to build PushPayload object.
		// PushPayload payload = buildPushObject_all_all_alert();
		// 判断用户别名和tag不为空的情况下才推送修改标签（tag）
		if (content != null && alias != null) {
			payload = PushPayload
					.newBuilder().setAudience(Audience.alias(alias)).setPlatform(Platform.all()).setMessage(Message
							.newBuilder().setMsgContent(content).addExtra("msgType", msgType.get("msgType")).build())
					.build();
		} else {
			log.info("No notification - " + content);
		}
		try {
			System.out.println(payload.toString());
			PushResult result = jpushClient.sendPush(payload);
			System.out.println(result + "................................");
			log.info("Got result - " + result);
		} catch (APIConnectionException e) {
			log.error("Connection error. Should retry later. ", e);
		} catch (APIRequestException e) {
			log.error("Error response from JPush server. Should review and fix it. ", e);
			log.info("HTTP Status: " + e.getStatus());
			log.info("Error Code: " + e.getErrorCode());
			log.info("Error Message: " + e.getErrorMessage());
			log.info("Msg ID: " + e.getMsgId());
		}
	}
	/**
	 * 	1代表学习类通知，需要单独开发模块
		2代表单人通知，可以在消息中心看到
		3代表补差价通知，提示到补差价模块补差价
		4代表加价通知，提示到进行中加价
		5代表异地登录，强制下线
	 * @param alias   一个字符串
	 * @param content  信息内容
	 * @param msgType  类型
	 */
	public static void sendPushMessage2(String alias, String content, Map<String, String> msgType) {

		jpushClient = new JPushClient(MASTER_SECRET_MERCHANTS, APP_KEY_MERCHANTS, null, ClientConfig.getInstance());
		PushPayload payload = null;
		// For push, all you need do is to build PushPayload object.
		// PushPayload payload = buildPushObject_all_all_alert();
		// 判断用户别名和tag不为空的情况下才推送修改标签（tag）
		if (content != null && alias != null) {
			payload = PushPayload
					.newBuilder().setAudience(Audience.alias(alias)).setPlatform(Platform.all()).setMessage(Message
							.newBuilder().setMsgContent(content).addExtra("msgType", msgType.get("msgType")).build())
					.build();
		} else {
			log.info("No notification - " + content);
		}
		try {
			System.out.println(payload.toString());
			PushResult result = jpushClient.sendPush(payload);
			System.out.println(result + "................................");
			log.info("Got result - " + result);
		} catch (APIConnectionException e) {
			log.error("Connection error. Should retry later. ", e);
		} catch (APIRequestException e) {
			log.error("Error response from JPush server. Should review and fix it. ", e);
			log.info("HTTP Status: " + e.getStatus());
			log.info("Error Code: " + e.getErrorCode());
			log.info("Error Message: " + e.getErrorMessage());
			log.info("Msg ID: " + e.getMsgId());
		}
	}

	/**
	 * 查询记录推送成功条数
	 * 
	 * @param mid
	 */
	public static void countPush(String mid) {
		jpushClient = new JPushClient(MASTER_SECRET, APP_KEY, null, ClientConfig.getInstance());
		PushPayload payload = null;
		try {
			ReceivedsResult result = jpushClient.getReportReceiveds(mid);
			Received received = result.received_list.get(0);
			System.out.println("android_received:" + received.android_received + "\nios:" + received.ios_apns_sent);
			log.debug("Got result - " + result);
		} catch (APIConnectionException e) {
			// Connection error, should retry later
			log.error("Connection error, should retry later", e);
		} catch (APIRequestException e) {
			// Should review the error, and fix the request
			log.error("Should review the error, and fix the request", e);
			log.info("HTTP Status: " + e.getStatus());
			log.info("Error Code: " + e.getErrorCode());
			log.info("Error Message: " + e.getErrorMessage());
		}
	}

	/**
	 * 统计用户数据。需要vip用户才能访问
	 */
	public static void getReportUser() {
		jpushClient = new JPushClient(MASTER_SECRET, APP_KEY, null, ClientConfig.getInstance());
		try {
			UsersResult result = jpushClient.getReportUsers(TimeUnit.DAY, "2015-04-28", 8);
			// Received received =result
			// System.out.println("android_received:"+received.android_received+"\nios:"+received.ios_apns_sent);
			log.debug("Got result - " + result);
		} catch (APIConnectionException e) {
			// Connection error, should retry later
			log.error("Connection error, should retry later", e);
		} catch (APIRequestException e) {
			// Should review the error, and fix the request
			log.error("Should review the error, and fix the request", e);
			log.info("HTTP Status: " + e.getStatus());
			log.info("Error Code: " + e.getErrorCode());
			log.info("Error Message: " + e.getErrorMessage());
		}
	}

	/**
	 * 根据别名通知推送
	 * 
	 * @param alias
	 *            别名
	 * @param alert
	 *            推送内容
	 * @return
	 */
	public static PushPayload buldPushObject_all_all_alias(String alias, String title, String content,
			Map<String, String> map) {
		return PushPayload.newBuilder().setPlatform(Platform.all()).setAudience(Audience.alias(alias))
				.setNotification(Notification.newBuilder()
						.addPlatformNotification(IosNotification.newBuilder().setAlert(content).addExtras(map).build())
						.addPlatformNotification(AndroidNotification.newBuilder().setAlert(content).setTitle(title)
								.addExtras(map).build())
						.addPlatformNotification(
								WinphoneNotification.newBuilder().setAlert(content).addExtras(map).build())
						.build())
				.setOptions(Options.newBuilder().setApnsProduction(false).setTimeToLive(0).build()).build();
	}

	/**
	 * 根据tag通知推送
	 * 
	 * @param alias
	 *            别名
	 * @param alert
	 *            推送内容
	 * @return
	 */
	public static PushPayload buldPushObject_all_all_tag(String[] tags, String title, String content,
			Map<String, String> map) {
		return PushPayload.newBuilder().setPlatform(Platform.all()).setAudience(Audience.tag(tags))
				.setNotification(Notification.newBuilder()
						.addPlatformNotification(IosNotification.newBuilder().setAlert(content).addExtras(map).build())
						.addPlatformNotification(AndroidNotification.newBuilder().setAlert(content).setTitle(title)
								.addExtras(map).build())
						.addPlatformNotification(
								WinphoneNotification.newBuilder().setAlert(content).addExtras(map).build())
						.build())
				.build();
	}

	/**
	 * 根据tag通知推送
	 * 
	 * @param alias
	 *            别名
	 * @param alert
	 *            推送内容
	 * @return
	 */
	public static PushPayload buldPushObject_all_all_aliasAndTag(String alias, String[] tags, String title,
			String content, Map<String, String> map) {
		return PushPayload.newBuilder().setPlatform(Platform.all()).setAudience(Audience.alias(alias))
				.setAudience(Audience.tag(tags))
				.setNotification(Notification.newBuilder()
						.addPlatformNotification(IosNotification.newBuilder().setAlert(content).addExtras(map).build())
						.addPlatformNotification(AndroidNotification.newBuilder().setAlert(content).setTitle(title)
								.addExtras(map).build())
						.addPlatformNotification(
								WinphoneNotification.newBuilder().setAlert(content).addExtras(map).build())
						.build())
				.build();
	}

	/**
	 * 根据通知推送
	 * 
	 * @param alias
	 *            别名
	 * @param alert
	 *            推送内容
	 * @return
	 */
	public static PushPayload buldPushObject_all_all(String title, String content, Map<String, String> map) {
		return PushPayload.newBuilder().setPlatform(Platform.all()).setAudience(Audience.all())
				.setNotification(Notification.newBuilder()
						.addPlatformNotification(IosNotification.newBuilder().setAlert(content).addExtras(map).build())
						.addPlatformNotification(AndroidNotification.newBuilder().setAlert(content).setTitle(title)
								.addExtras(map).build())
						.addPlatformNotification(
								WinphoneNotification.newBuilder().setAlert(content).addExtras(map).build())
						.build())
				.build();
	}

}